package controller

import (
	"github.com/gin-gonic/gin"
	"shop-bean/constant"
	"shop-bean/model"
	"shop-bean/request"
	"shop-common/library/serializer"
	"shop-common/utils"
	"shop-common/utils/contextArgs"
	"shop-common/utils/pagehelper"
	"shop-common/utils/queryWrapper"
	"shop-service/business"
)

type ProdTagController struct {
}

// @Tags 分组管理
// @description: 全部
// @Summary 全部
// @Security ApiKeyAuth
// @function: List
// @Accept  json
// @Produce  json
// @Router /prod/prodTag/list [get]
func (p *ProdTagController) List(ctx *gin.Context) {
	list, err := business.ServiceImpl().ProdTagService.Find(ctx)
	if err != nil {
		serializer.Fail(ctx, serializer.PublicQueryErr)
		return
	}

	serializer.SuccessData(ctx, "", list)
}

// @Tags 分组管理
// @description: 分页
// @Summary 分页
// @Security ApiKeyAuth
// @function: Page
// @Accept  json
// @Produce  json
// @Param current query string false "当前页，默认1"
// @Param size query string false "每页大小，默认10"
// @Param keyword query string false "keyword"
// @Success 200 {object} string "{"code":0," result":{}, "message":"操作成功", "time":1618493448}"
// @Router /prod/prodTag/page [get]
func (p *ProdTagController) Page(ctx *gin.Context) {
	form := pagehelper.SearchPageRequest{}
	if err := serializer.Verify(ctx, &form); err != nil {
		serializer.Fail(ctx, err.Error())
		return
	}

	page, err := business.ServiceImpl().ProdTagService.FindPage(ctx, &form)
	if err != nil {
		serializer.Fail(ctx, serializer.PublicQueryErr)
		return
	}
	serializer.SuccessData(ctx, "", page)
}

// @Tags 分组管理
// @description: 通过id查询商品分组标签
// @Summary 单个数据
// @Security ApiKeyAuth
// @function: Info
// @Accept  json
// @Produce  json
// @Param id path int true "id"
// @Success 200 {object} string "{"code":0," result":{}, "message":"操作成功", "time":1618493448}"
// @Router /prod/prodTag/info/{id} [get]
func (p *ProdTagController) Info(ctx *gin.Context) {
	id, err := contextArgs.GetUriIntPath(ctx, "id")
	if err != nil {
		serializer.Fail(ctx, err.Error())
		return
	}

	prodTag, err := findProdTagById(ctx, id)
	if err != nil {
		serializer.Fail(ctx, serializer.PublicQueryErr)
		return
	}

	serializer.SuccessData(ctx, "", prodTag)
}

// @Tags 分组管理
// @description: 新增
// @Summary 新增
// @Security ApiKeyAuth
// @function: Save
// @Accept  json
// @Produce  json
// @Param data body request.ProdTagRequest true "请求参数"
// @Success 200 {object} string "{"code":0," result":{}, "message":"操作成功", "time":1618493448}"
// @Router /prod/prodTag [post]
func (p *ProdTagController) Save(ctx *gin.Context) {
	form := request.ProdTagRequest{}
	if err := serializer.Verify(ctx, &form); err != nil {
		serializer.Fail(ctx, err.Error())
		return
	}

	exist, err := business.ServiceImpl().ProdTagService.CheckExist(ctx, queryWrapper.Eq("title", form.Title))
	if err != nil {
		serializer.Fail(ctx, serializer.PublicCreateErr)
		return
	}

	if exist {
		serializer.Fail(ctx, "标签已存在")
		return
	}

	var prodTag model.ProdTag
	err = utils.StructMapStrict(form, &prodTag)
	if err != nil {
		serializer.Fail(ctx, serializer.PublicCreateErr)
		return
	}
	prodTag.IsDefault = constant.CUSTOM
	prodTag.ShopId = constant.SHOP_ID

	err = business.ServiceImpl().ProdTagService.Create(ctx, &prodTag)
	if err != nil {
		serializer.Fail(ctx, serializer.PublicCreateErr)
		return
	}

	serializer.SuccessData(ctx, "", prodTag.Id)
}

// @Tags 分组管理
// @description: 修改
// @Summary 修改
// @Security ApiKeyAuth
// @function: Update
// @Accept  json
// @Produce  json
// @Param data body request.ProdTagRequest true "请求参数"
// @Success 200 {object} string "{"code":0," result":{}, "message":"操作成功", "time":1618493448}"
// @Router /prod/prodTag [put]
func (p *ProdTagController) Update(ctx *gin.Context) {
	form := request.ProdTagRequest{}
	if err := serializer.Verify(ctx, &form); err != nil {
		serializer.Fail(ctx, err.Error())
		return
	}

	if form.Id < 1 {
		serializer.Fail(ctx, "id不能为空")
		return
	}

	columns := map[string]interface{}{
		"title":  form.Title,
		"status": form.Status,
		"style":  form.Style,
		"seq":    form.Seq,
	}

	err := business.ServiceImpl().ProdTagService.Updates(ctx, form.Id, columns)
	if err != nil {
		serializer.Fail(ctx, serializer.PublicUpdateErr)
		return
	}

	serializer.Success(ctx, "")
}

// @Tags 分组管理
// @description: 删除
// @Summary 删除
// @Security ApiKeyAuth
// @function: Delete
// @Accept  json
// @Produce  json
// @Param id path int true "id"
// @Success 200 {object} string "{"code":0," result":{}, "message":"操作成功", "time":1618493448}"
// @Router /prod/prodTag/{id} [delete]
func (p *ProdTagController) Delete(ctx *gin.Context) {
	id, err := contextArgs.GetUriIntPath(ctx, "id")
	if err != nil {
		serializer.Fail(ctx, err.Error())
		return
	}

	prodTag, err := findProdTagById(ctx, id)
	if err != nil {
		serializer.Fail(ctx, serializer.PublicQueryErr)
		return
	}

	if prodTag.IsDefault != 1 {
		serializer.Fail(ctx, "默认标签不能删除")
		return
	}

	err = business.ServiceImpl().ProdTagService.Delete(ctx, uint(id))
	if err != nil {
		serializer.Fail(ctx, serializer.PublicDeleteErr)
		return
	}

	serializer.Success(ctx, "")
}

func findProdTagById(ctx *gin.Context, id uint) (prodTag *model.ProdTag, err error) {
	return business.ServiceImpl().ProdTagService.FindById(ctx, id)
}
